# IO案例实现一个文件夹中（目录中可能还有子目录），拷贝所有的py文件。到另外一个指定的目录中
import os


# 确定源目录：D:\biancheng\daimacangku\python


def copy_file(src_file, dst_file):
    """
    拷贝单个文件内容，把src_file文件内容，拷贝到dst_file
    :param src_file: 原始文件的绝对路径
    :param dst_file: 目标文件的绝对路径
    :return: 拷贝成功之后返回1
    """
    # 第一种：小文件(100M以下)，一次性读取，一次性写入新文件
    # with open(src_file, mode='r', encoding='utf8') as s_f:
    #     content = s_f.read()
    #     with open(dst_file, mode='w', encoding='utf8') as d_f:
    #         d_f.write(content)
    # return 1

    # 第二种：大文件，每次从源文件中读取一部分内容，并且写入到新文件中（循环多次）
    source_file = open(src_file, mode='r', encoding='utf8')
    sink_file = open(dst_file, mode='a', encoding='utf8')

    while True:
        content = source_file.read(1024 * 1)  # 每次读1KB
        if content == '' or content is None:
            # 没有读取到数据，退出循环，说明文件读完了
            break
        sink_file.write(content)
    source_file.close()
    sink_file.close()
    return 1


def copy_dir(src_dir, dst_dir):
    """
    拷贝 src_dir目录中的所有py文件到dst_dir中
    :param src_dir: 原始目录
    :param dst_dir: 目标目录
    :return: 返回一个拷贝的文件数量
    """
    count = 0
    for f in os.listdir(src_dir):  # f代表原始目录下每个文件（目录）的名字
        # 把文件名和目录拼凑成一个完整的绝对路径
        f_path = os.path.join(src_dir, f)
        if os.path.isfile(f_path) and f.endswith('.py'):
            # 判断既是普通文件，又是 py 文件
            # 拷贝该文件，先判断目标目录是不是不存在
            if not os.path.exists(dst_dir):
                os.makedirs(dst_dir)  # 创建多层目录，防止传入的目标目录前面几层都不存在
            # 拼凑一个拷贝之后的目标文件的绝对路径
            sink_path = os.path.join(dst_dir, f)
            # 拷贝文件内容到sink_path
            num = copy_file(f_path, sink_path)
            count += num
        elif os.path.isdir(f_path):
            # 判断f_path是目录
            # 采用递归函数，为了保持同样的目录结构，目录目录跟着变化
            new_dst_path = os.path.join(dst_dir, f)  # 新目录名
            copy_dir(f_path, new_dst_path)
    return count


copy_dir(r'D:\biancheng\daimacangku\python', r'E:\biancheng\daimacangku1\python2')
